home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -serious- / comms / www / urlx / urlv.c < prev    next >
C/C++ Source or Header  |  1999-09-06  |  4KB  |  206 lines

  1. ;/* Program to extract URL's from Voyager history
  2. dcc -pr -o urlv urlv.c
  3. quit
  4. */
  5.  
  6. #include <sys/types.h>
  7. #include <stdio.h>
  8. #include <ctype.h>
  9.  
  10. #define getl_be(a) (  ((u_long)(((u_char *)(a))[3]))        \
  11.                     + ((u_long)(((u_char *)(a))[2]) << 8)   \
  12.                     + ((u_long)(((u_char *)(a))[1]) << 16)  \
  13.                     + ((u_long)(((u_char *)(a))[0]) << 24))
  14.  
  15. FILE *f1_p;
  16. char *blkbuf;
  17.  
  18. static const char PROGVER[] =
  19.   "\0$VER: urlv V1.00 ** (c) Jul 99 ** frans";
  20.  
  21. static const char USAGE[] =
  22.   "usage: urlv [voyager_history_filename]";
  23.  
  24. void cleanup(void)
  25. {
  26.   if (f1_p)
  27.     fclose(f1_p);
  28.   if (blkbuf)
  29.     free(blkbuf);
  30. }
  31.  
  32. void shutdown(char *msg, ...)
  33. {
  34.   vfprintf(stderr, msg, (void *)(&msg + 1));
  35.   exit(0);
  36. }
  37.  
  38. void usage(void)
  39. {
  40.   shutdown("%s\n\n%s\n\n", PROGVER + 7, USAGE);
  41. }
  42.  
  43. void *xalloc(long len)
  44. {
  45.   char *p;
  46.   if ((p = (char *)malloc(len)) == 0)
  47.     shutdown("out of memory\n");
  48.   return (void *)p;
  49. }
  50.  
  51. char *ultoa_f(
  52.   unsigned long n,char *buf,int radix,int len,char pre)
  53. {
  54.   char *p = (buf += len);
  55.   *buf = 0;
  56.   do
  57.   {
  58.     *--buf ="0123456789ABCDEF"[n % radix];
  59.   } while((--len) && (n /= radix));
  60.   while(len--)
  61.     *--buf = pre;
  62.   return p;
  63. }
  64.  
  65. hexdump(char *buf, long address, long len)
  66. {
  67.   long c, cnt = 0;
  68.   char obuf[80], *op1, *op2;
  69.  
  70.   while (len != 0)
  71.   {
  72.     if ((cnt & 15) == 0)
  73.     {
  74.       op1 = ultoa_f(address, obuf, 16, 6, '0');
  75.       *op1++ = ':';
  76.       op2 = obuf + 44;
  77.     }
  78.     c = (*buf++) & 0xFF;
  79.     if ((cnt & 3) == 0)
  80.       *op1++ = ' ';
  81.     op1 = ultoa_f(c, op1, 16, 2, '0');
  82.     *op2++ = (c > 31 && c < 127) ? c : '.';
  83.     *op2 = 0;
  84.     cnt++;
  85.     address++;
  86.     len--;
  87.     if ((cnt & 15) == 0 || len == 0)
  88.     {
  89.       while (op1 - obuf < 44)
  90.         *op1++ = ' ';
  91.       printf("%ls\n", obuf);
  92.     }
  93.   }
  94.   return cnt;
  95. }
  96.  
  97. char *getnum(char *s, long *np)
  98. {
  99.   long n, h, sign = 1;
  100.   char c;
  101.   while (*s == ' ' || *s == '\t')
  102.     s++;
  103.   if (*s == '-')
  104.     s++, sign = -1;
  105.   n = 0;
  106.   if (*s == '$' || (*s == '0' && *++s == 'x'))
  107.   {
  108.     s++;
  109.     while (isxdigit(*s))
  110.     {
  111.       c = *s++;
  112.       h = ((c < 58) ? c - 48 : ((c < 96) ? c - 55 : c - 87));
  113.       n = (n << 4) + h;
  114.     }
  115.   }
  116.   else
  117.   {
  118.     while (isdigit(*s))
  119.     {
  120.       h = *s++ - 48;
  121.       n = n * 10 + h;
  122.     }
  123.   }
  124.   *np = n * sign;
  125.   return s;
  126. }
  127.  
  128. int main(int argc, char **argv)
  129. {
  130.   int   i, quiet_f, verbose_f;
  131.   long  f1_len, len, ulen;
  132.   char  *f1_name, *p;
  133.  
  134.   f1_p     = 0;
  135.   blkbuf   = 0;
  136.   f1_name  = 0;
  137.  
  138.   quiet_f  = verbose_f = 0;
  139.  
  140.   atexit(cleanup);
  141.  
  142.   for (i = 1; i < argc; i++)
  143.   {
  144.     if (*(p = argv[i]) == '-')
  145.     {
  146.       switch (*++p)
  147.       {
  148.       case 'v':
  149.         verbose_f = 1;
  150.         if (*++p == 'v')
  151.           verbose_f = 2;
  152.         break;
  153.       case 'q':
  154.         quiet_f = 1;
  155.         if (*++p == 'q')
  156.           quiet_f = 2;
  157.         break;
  158.       default:
  159.         usage();
  160.       }
  161.     }
  162.     else if (f1_name == 0)
  163.       f1_name = p;
  164.     else
  165.       usage();
  166.   }
  167.   if (f1_name == 0)
  168.     usage();
  169.  
  170.   if (verbose_f)
  171.     fprintf(stderr, "%s\n\n", PROGVER + 7);
  172.  
  173.   if ((f1_p = fopen(f1_name, "rb")) == 0)
  174.     shutdown("Couldn't open input file %s\n", f1_name);
  175.  
  176.   fseek(f1_p, 0L, 2);
  177.   f1_len = ftell(f1_p);
  178.   fseek(f1_p, 0L, 0);
  179.  
  180.   if ((len = f1_len) != 0)
  181.     blkbuf = xalloc(f1_len);
  182.  
  183.   if (fread(blkbuf, f1_len, 1, f1_p) != 1)
  184.     shutdown("read error\n");
  185.  
  186.   /*
  187.    *  now whole file is in buffer so scan it
  188.    */
  189.  
  190.   for (p = blkbuf; p - blkbuf < len; )
  191.   {
  192.     p += 8; ulen = getl_be(p); p += 4;
  193.  
  194.     while (ulen && *p != 0)
  195.     {
  196.       printf("%c", *p++); ulen--;
  197.     }
  198.     printf("\n");
  199.  
  200.     while (ulen--)
  201.       p++;
  202.   }
  203.  
  204.   exit(0);
  205. }
  206.